#include <iostream>
#include <string>
#include <sqlite3.h>
#include <vector>
#include <cassert>
#include "loger.hpp"

class  SqliteHelper{
typedef int (*SqliteCallback)(void*,int,char**,char**);

public:
    SqliteHelper(const std::string& dbfile):_dbfile(dbfile),_handler(nullptr){}


//int sqlite3_open_v2(const char *filename, sqlite3 **ppDb, int flags, const char *zVfs );
bool open(int safe_leve = SQLITE_OPEN_FULLMUTEX)//SQLITE_OPEN_FULLMUTEX默认就为串行化模式
{
    int ret = sqlite3_open_v2(_dbfile.c_str(),&_handler,safe_leve | SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE,nullptr);
    //第一个参数是db文件路径
    //第二个参数是一个输出型变量，我们将sqlite的句柄传进去，获取open后db的句柄
    //第三个参数是文件打开的默认权限和方式 和 线程的安全等级
    //SQLITE_OPEN_CREATE： 不存在数据库⽂件则创建
    // SQLITE_OPEN_READWRITE -- 以可读可写⽅式打开数据库⽂件
    //第四个参数设为空即可
    if(ret != SQLITE_OK)
    {
        ELOG( "创建/打开sqlite数据库失败：%s",sqlite3_errmsg(_handler));
        return false;
    }
    else{
         DLOG("打开成功");
        return true;
    }
}

//提前设置 SqliteCallback ==  int (*SqliteCallback)(void*,int,char**,char**)回调函数
bool exec(const std::string& sql,SqliteCallback cb,void* arg){
    int ret = sqlite3_exec(_handler,sql.c_str(),cb,arg,nullptr);
    //

    if(ret != SQLITE_OK)
    {
        std::cout << sql << std::endl;
        ELOG( "执行失败、查看错误信息: %s",sqlite3_errmsg(_handler));
        return false;
    }
    else{
        DLOG ("执行成功");
        return true;
    }
}

bool close(){
    sqlite3_close_v2(_handler);//
    return true;
}

private:
    std::string _dbfile;
    sqlite3 * _handler;
};





